//
// Created by fh on 2021/5/28.
//

#include "SqList.h"

/* 用e返回L中第i个数据元素的值 */
/* 因为返回元素的值不用修改到线性表里的数据，所以函数传了个L而不是L的地址，
 * 调用的时候是传了外部实参的一份拷贝值，所以不会修改到原来的L的元素的值，
 * 这里如果用SqList *L代替,有可能就会修改到原来实参data里面的值，因为传进来的是外面实参的地址，
 * 拿到地址就能修改内存里的值了 */
Status SqListGetElem(SqList L,int i,int *e) {
    printf("形参L的内存地址: %p\n",&L);
    if (L.length == 0 || i < 1 || i > L.length) {
        return ERROR;
    }
    *e = L.data[i-1];
    return OK;
}

/* 在L中第i个位置之前插入新的数据元素e,L的长度+1
 * 这里要用*L是因为这个方法需要修改到实参L的元素的值 */
Status SqListInsert(SqList *L,int i,int e) {
    printf("形参L的内存地址: %p\n",L);
    // 满了
    if (L->length == MAXSIZE) {
        return ERROR;
    }
    // i > L->length时当第一次插入元素i=1时有问题
    if (i < 1 || i > L->length+1) {
        return ERROR;
    }
    for (int j = L->length-1; j > i-1; --j) {
        L->data[j+1] = L->data[j];
    }
    L->data[i-1] = e;
    L->length++;
    return OK;
}

/* 删除L的第i个数据元素，并用e返回其值，L的长度-1 */
Status SqListDelete(SqList *L,int i,int *e) {
    printf("形参L的内存地址: %p\n",L);
    if (L->length == 0) {
        return ERROR;
    }
    if (i < 1 || i > L->length) {
        return ERROR;
    }
    *e = L->data[i-1];
    for (int j = i-1; j < L->length-1; ++j) {
        L->data[j] = L->data[j+1];
    }
    L->length--;
    return OK;
}

/* 用e值修改L的第i个元素数据 */
Status SqListModify(SqList *L,int i,int e) {
    if (i < 1 || i > L->length) {
        return ERROR;
    }
    L->data[i-1] = e;
    return OK;
}

/* 打印线性表 */
Status SqListDisplay(SqList L) {
    printf("形参L的内存地址: %p\n",&L);
    if (L.length == 0) {
        printf("该线性表为空\n");
        return ERROR;
    }
    for (int i = 0; i < L.length; ++i) {
        printf("%d ",L.data[i]);
    }
    printf("\n");
    return OK;
}

void sqListTestDemo() {
    SqList *L = malloc(sizeof(SqList));
    printf("sqListTestDemo L : %p\n",L);
    Status result;

    printf("-------------- 增 ----------------\n");
    result = SqListInsert(L,1,2);
    printf("insert result: %d\n",result);

    result = SqListInsert(L,2,5);
    printf("insert result: %d\n",result);

    result = SqListInsert(L,3,6);
    printf("insert result: %d\n",result);

    result = SqListInsert(L,4,9);
    printf("insert result: %d\n",result);

    result = SqListInsert(L,5,12);
    printf("insert result: %d\n",result);

    result = SqListDisplay(*L);

    printf("-------------- 删 ----------------\n");
    int a = 0;
    printf("before delete a : %d\n",a);
    result = SqListDelete(L,1,&a);
    printf("delete result: %d\n",result);
    printf("after delete a : %d\n",a);

    result = SqListDisplay(*L);

    printf("-------------- 查 ----------------\n");
    printf("before GetElem a : %d\n",a);
    result = SqListGetElem(*L,2,&a);
    printf("GetElem result: %d\n",result);
    printf("after GetElem a : %d\n",a);

    result = SqListDisplay(*L);

    printf("-------------- 改 ----------------\n");
    result = SqListModify(L,2,55);
    printf("modify result: %d\n",result);

    result = SqListDisplay(*L);

    printf("-------------- 遍历 ----------------\n");
    result = SqListDisplay(*L);
    printf("display result: %d\n",result);
}
